package com.supermap.dataservice.common;

import com.alibaba.dubbo.config.annotation.Service;
import com.supermap.dataservice.common.dao.AreaDao;
import com.supermap.dataservice.util.JSONUtil;
import com.supermap.dubbo.api.common.AreaService;
import com.supermap.dubbo.api.common.entity.Area;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;

/**
 * @Author:langhongshuai
 * @Description:区域业务逻辑层
 * @Date:18/1/8 上午11:16
 */
@Service
public class AreaServiceImpl implements AreaService {

    /**
     *使用指定类初始化日志对象，在日志输出的时候，可以打印出日志信息所在类
     */
    protected static final Logger logger = LoggerFactory.getLogger(AreaServiceImpl.class);

    @Resource
    private AreaDao areaDao;

    @Override
    public JSONUtil getAllAreas() {
        //初始化Json封装工具类
        JSONUtil jsonUtil = new JSONUtil();
        try {
            //获得所有的区域信息
            List<Area> areas = areaDao.getAllArea();

            //使区域层级化
            areas = organizeArea(areas);

         //获取所有的区域信息后返回的json数据
            jsonUtil.setMsg("Get all areas success！");
            jsonUtil.setIsSuccess(true);
            jsonUtil.setCode(200);
            jsonUtil.setData(areas);
        }catch (Exception e) {
            //捕捉数据库异常
            logger.error("AreaServiceImpl=>getAllArea=>DaoException:"+e.getMessage());
            jsonUtil.setMsg("Get all areas flase！");
            jsonUtil.setIsSuccess(false);
            jsonUtil.setCode(100);
        }
        return jsonUtil;
    }

    @Override
    public JSONUtil getAreaByName(String areaName) {
        //初始化Json封装工具类
        JSONUtil jsonUtil = new JSONUtil();
        try {
            //获得区域信息
            Area area = areaDao.getAreaByName(areaName);

            //获取区域信息后返回的json数据
            jsonUtil.setMsg("Get area success！");
            jsonUtil.setIsSuccess(true);
            jsonUtil.setCode(200);
            jsonUtil.setData(area);
        }catch (Exception e) {
            //捕捉数据库异常
            logger.error("AreaServiceImpl=>getAreaByName=>DaoException:"+e.getMessage());
            jsonUtil.setMsg("Get area flase！");
            jsonUtil.setIsSuccess(false);
            jsonUtil.setCode(100);
        }
        return jsonUtil;
    }

    @Override
    public JSONUtil getAreasByCode(String code) {
        //初始化Json封装工具类
        JSONUtil jsonUtil = new JSONUtil();
        Area area = new Area();
        try {
            //获得所有的区域信息
            List<Area> areas = areaDao.getAllArea();

            //使区域层级化
            areas = organizeArea(areas);
            ok:
            for (Area a:areas) {
                if(a.getAreaCode().equals(code)){
                    area = a;
                    break ok;
                }else {
                    for (Area b : a.getChildNode()) {
                        if (b.getAreaCode().equals(code)) {
                            area = b;
                            break ok;
                        } else {
                            for (Area c : b.getChildNode()) {
                                if (c.getAreaCode().equals(code)) {
                                    area = c;
                                    break ok;
                                }
                            }
                        }
                    }
                }
            }
            //获取所有的区域信息后返回的json数据
            jsonUtil.setMsg("Get all areas success！");
            jsonUtil.setIsSuccess(true);
            jsonUtil.setCode(200);
            jsonUtil.setData(area);
        }catch (Exception e) {
            //捕捉数据库异常
            logger.error("AreaServiceImpl=>getAllArea=>DaoException:"+e.getMessage());
            jsonUtil.setMsg("Get all areas flase！");
            jsonUtil.setIsSuccess(false);
            jsonUtil.setCode(100);
        }
        return jsonUtil;
    }

    @Override
    public JSONUtil getFocusAreaByUserId(String userId) {
        //初始化Json封装工具类
        JSONUtil jsonUtil = new JSONUtil();
        try {
            //获得关注区域code
            List<Area> areas = areaDao.getFocusAreaCodeByuserId(Integer.parseInt(userId));
            if(areas!=null && areas.size()==1){
                jsonUtil.setData(areas.get(0).getAreaCode());
            }else {
                jsonUtil.setData("");
            }
            //获取区域信息后返回的json数据
            jsonUtil.setMsg("Get area success！");
            jsonUtil.setIsSuccess(true);
            jsonUtil.setCode(200);
        }catch (Exception e) {
            //捕捉数据库异常
            logger.error("AreaServiceImpl=>getAreaByName=>DaoException:"+e.getMessage());
            jsonUtil.setMsg("Get area flase！");
            jsonUtil.setIsSuccess(false);
            jsonUtil.setCode(100);
        }
        return jsonUtil;
    }

    @Override
    public JSONUtil delFocusAreaCode(String userid, String areaCode) {
        //初始化Json封装工具类
        JSONUtil jsonUtil = new JSONUtil();
        try {
            //获得区域信息
            areaDao.delFocusAreaCode(Integer.parseInt(userid),areaCode);

            //获取区域信息后返回的json数据
            jsonUtil.setMsg("Get area success！");
            jsonUtil.setIsSuccess(true);
            jsonUtil.setCode(200);
            jsonUtil.setData("");
        }catch (Exception e) {
            //捕捉数据库异常
            logger.error("AreaServiceImpl=>getAreaByName=>DaoException:"+e.getMessage());
            jsonUtil.setMsg("Get area flase！");
            jsonUtil.setIsSuccess(false);
            jsonUtil.setCode(100);
        }
        return jsonUtil;
    }

    @Override
    public JSONUtil addFocusAreaCode(String userid, String areaCode) {
        //初始化Json封装工具类
        JSONUtil jsonUtil = new JSONUtil();
        try {
            //获得区域信息
            areaDao.addFocusAreaCode(Integer.parseInt(userid),areaCode);

            //获取区域信息后返回的json数据
            jsonUtil.setMsg("Get area success！");
            jsonUtil.setIsSuccess(true);
            jsonUtil.setCode(200);
            jsonUtil.setData("");
        }catch (Exception e) {
            //捕捉数据库异常
            logger.error("AreaServiceImpl=>getAreaByName=>DaoException:"+e.getMessage());
            jsonUtil.setMsg("Get area flase！");
            jsonUtil.setIsSuccess(false);
            jsonUtil.setCode(100);
        }
        return jsonUtil;
    }


    /**
     * 将区域层级化
     * @param areaList
     * @return
     */
    private List<Area> organizeArea(List<Area> areaList){
        //创建新的区域列表
        List<Area> areaFirstList = new ArrayList<>();

        for (Area a:areaList) {
            //当区域code的长度为2时，为第一层级
            if(a.getAreaCode().length()==2){
                List<Area> areaSecondList = new ArrayList();
                for (Area b:areaList){
                    //当区域code的长度为4，为第二层级
                    if(b.getAreaCode().length() == 4 && b.getAreaCode().substring(0,2).equals(a.getAreaCode())){
                        List<Area> areaThirdList = new ArrayList();
                        for (Area c:areaList){
                            //当区域code的长度为6，为第三层级
                            if(c.getAreaCode().length() == 6 && c.getAreaCode().substring(0,4).equals(b.getAreaCode())){
                                //增加3级子节点
                                areaThirdList.add(c);
                            }
                        }
                        //设置所有的3级区域子节点
                        b.setChildNode(areaThirdList);
                        //增加2级子节点
                        areaSecondList.add(b);
                    }
                }
                //设置所有的2级区域子节点
                a.setChildNode(areaSecondList);
                //增加1级节点
                areaFirstList.add(a);
            }
        }
        return areaFirstList;
    }




}
